环境不是 shell 的一部分. 但是 shell 包括一些可以让用户读取和修改环境的命令.

使用环境

列出环境

env 命令可以列出当前所有的环境设置

env 是一个普通的程序, 而不是 shell 内置的命令.

更新环境

  1. var=value 变量复制
  2. export var 使用 shell 内置命令 export 向环境添加新的变量.

在 C 程序中读入环境

使用标准的 C 库函数 getenv 也可以得到环境变量的值

#include <stdlib.h>
main()
{
    char *cp = getenv("LANG");
    if (cp != NULL && strcmp(cp, "fr") == 0)
        printf("Bonjour\n");
    else
        printf("Hello\n");
}

环境

环境是每个程序都可以存取的一个字符串数组. 每个数组中的字符串都以 var=value 这样的形式出现, 数组地址被存放在一个名为 environ 的全局变量里. 环境就是 environ 指向的字符串数组, 读环境就是读这个字符串数组, 改变环境 就是改变字符串, 改变这个数组中的指针或者将这个全局指针指向其他数组.

exec 系统调用时, 用目标程序的代码和数据替换调用程序的代码和数据. 但是 environ 指针指向的数组是唯一的例外, 当内核执行习题哦你个调用 execve 时, 它将数组和字符串复制大新的程序和数据空间.

在生成子进程的过程中, 观察 environ 数组的变化, 可以看到, fork 完整地复制 父进程, 包括代码和数据, 数据中包括了环境. exec 清除原来的进程中的所有代码 和数据, 插入新程序的代码和数据. 只有通过参数 execvp 传递的数据和存储在环境 中的字符串可以从旧程序复制到新程序

子进程中的环境的设置是父进程环境的副本, 子进程不能修改父进程的环境.